package com.test;


import com.test.dao.PeopleDao;
import com.test.pojo.People;
import org.beetl.sql.core.SQLManager;
import org.beetl.sql.ext.spring4.SqlManagerFactoryBean;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class SpringbootBeetsqlApplicationTest_People {


    Logger logger= LoggerFactory.getLogger(SpringbootBeetsqlApplicationTest_People.class);

    @Autowired
    SqlManagerFactoryBean sqlManagerFactoryBean;


    //有了 SqlManagerFactoryBean 对象会自动生成这个对象
    @Autowired
    public SQLManager sqlmanager;




    //增删改查第一种方式  通过 SQLManager 对象来操作

    /*  unique()方法 通过主键查询
    * */

    @Test
    void contextLoads2() {


        People peope = new People();

        peope.setName("张三");
        peope.setAge(18);


        //beetSQL的插入语句  insert into `people_ceshi` (`name`,`age`,`create_date`) VALUES (?,?,?)
        // 对于自增主键  这一行根本不起作用
        peope.setId(5);

        peope.setCreateDate(new Date());


        sqlmanager.insert(peope);



    }




   //查找  单个实体
    @Test
    void contextLoads3() {

        People peope = new People();

        int number= 1;


        //通过主键查找   条件有了
        //  User.class  封装的实体有了
        //  从哪个表找?  优先看 User 实体类 的  @Table 注解指定的表  没有实体类名字  就是  表名
        try {

            // select * from `people_ceshi` where `id` = ?
            peope = sqlmanager.unique(People.class,number);

            System.out.println(peope);
        } catch (Exception e) {
            logger.warn("*************unique查询user,但数据库未找到结果集:主键是"+number);
        }
    }


    // 查找 集合  多条件查询
    @Test
    void contextLoads34() {


        People peope = new People();

        peope.setName("张三");
        peope.setAge(18);
        // select * from `people_ceshi` where 1=1 and `name`=? and `age`=?
        List<People> list = sqlmanager.template(peope);

        System.out.println(list);



    }


    // 模板更新
    @Test
    void contextLoads344() {


        People peope = new People();
        peope.setName("张三");
        peope.setAge(20);
        peope.setId(1);

        //  update `people_ceshi` set `name`=?, `age`=? where `id` = ?
        int i = sqlmanager.updateTemplateById(peope);

        // 更新成功返回 1   失败返回 0
        System.out.println(i);

    }


    // 模板更新  参数和数据库字段 要对应
    @Test
    void contextLoads5() {

        Map<String,Object>  params=new HashMap<>();

        params.put("id",1);
        params.put("age",30);

        //  	 update `people_ceshi` set `age`=? where `id` = ?
        int i = sqlmanager.updateTemplateById(People.class,params);


        // 更新成功返回 1   失败返回 0
        System.out.println(i);

    }


  /********************************************************************************** 以下使用 BaseMapper  接口  来实现增删改查  */

  //  继承 BaseMapper 接口 也可以使用 很多的内置模板方法 类似于SQLmanager 中的内置方法    而且还可以 定制自己的方法
  // 注意实体类必须实现  Serializable 接口 可能代理类需要使用到  被代理类 需要 实现 Serializable 接口

  //查找  单个实体
  @Test
  void contextLoads6() {


      //获取 代理类
      PeopleDao mapper = sqlmanager.getMapper(PeopleDao.class);


      //通过主键查找   条件有了
      //  PeopleDao.class  封装的实体有了
      //  从哪个表找?  优先看 People 实体类 的  @Table 注解指定的表  没有实体类名字  就是  表名
      try {

          // select * from `anytable` where `id` = ?
         People peopefind = mapper.unique(1);

          System.out.println(peopefind);
      } catch (Exception e) {
          logger.warn("*************unique查询user,但数据库未找到结果集:主键是"+1);
      }
  }


    // 查找 集合  多条件查询
    @Test
    void contextLoads7() {
        //获取 代理类
        PeopleDao mapper = sqlmanager.getMapper(PeopleDao.class);


        People peope = new People();

        peope.setName("张三");
        peope.setAge(18);

        // select * from `anytable` where 1=1 and `name`=? and `age`=?
        List<People> list = mapper.template(peope);


        System.out.println(list);

    }


    // 模板更新
    @Test
    void contextLoads8() {

        //获取 代理类
        PeopleDao mapper = sqlmanager.getMapper(PeopleDao.class);



        People peope = new People();
        peope.setName("张三");
        peope.setAge(20);
        peope.setId(1);

        //  update `anytable` set `name`=?, `age`=? where `id` = ?
        int i = mapper.updateTemplateById(peope);

        // 更新成功返回 1   失败返回 0
        System.out.println(i);

    }



    // 自定义查询
    @Test
    void contextLoads9() {

        //获取 代理类
        PeopleDao mapper = sqlmanager.getMapper(PeopleDao.class);


        // select * from anytable where id=?
        People peo = mapper.findById(1);

        // 更新成功返回 1   失败返回 0
        System.out.println(peo);



        Map<String,Object>  params=new HashMap<>();

        params.put("id",1);
        sqlmanager.select("ceshi.findById",People.class,params);

    }


    // 自定义查询
    @Test
    void contextLoads10() {

      // sqlmanager  调用  mapper的 md文件

        Map<String,Object>  params=new HashMap<>();


        //将参数保存在 集合中
        params.put("id",1);

        // select * from anytable where id=?
        List<People> list = sqlmanager.select("ceshi.findById", People.class, params);


        System.out.println(list);

    }



}
